#include <iostream>

using namespace std;

/*
 * 拷贝构造函数的调用时机
 *      1、使用一个已经创建完成的对象来初始化一个新对象
 *      2、值传递的方式给函数参数传值
 *      3、以值方式返回局部对象
 *
 *  创建一个类，程序默认提供默认构造函数(空实现)，析构函数(空实现) 拷贝构造(值拷贝)
 *
 * 注    1、用户定义了有参构造函数，程序不提供默认无参构造函数，但是会提供默认拷贝构造
 *       2、用户定义了拷贝构造函数，程序不提供其他构造函数
 */

class Person{
public:
    int age;
    Person(){
        cout << "Person的无参构造函数" << endl;
    }
    Person(int a){
        age = a;
        cout << "Person的有参构造函数" << endl;
    }
    Person(const Person &p){
        age = p.age;
        cout << "Person的拷贝构造函数" << endl;
    }
    ~Person(){
        cout << "Person的析构函数" << endl;
    }
};

//1、使用一个已经创建完成的对象来初始化一个新对象
void test01() {
    Person p;
    Person p2(p);
}

void doSome(Person p) {
    return;
}

//2、值传递的方式给函数参数传值
void test02() {
    Person p1;
    doSome(p1);
}

Person doSome2(){  // 此处没有调用拷贝构造函数是编译器做了优化
    Person p3;
    cout << &p3 << endl;
    return p3;
}

//3、以值方式返回局部对象
void test03() {
    Person p = doSome2();
    cout << &p << endl;
}

int main() {

//    test01();

//    test02();

    test03();

    return 0;
}
